//
//  CZStatusViewModel.swift
//  iOSWeibo10
//
//  Created by itcast on 16/5/15.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

/// 负责 CZStatus模型数据的加载(网络请求), 将字典转成模型数组
class CZStatusViewModel: NSObject {
    /// 单例
    static let sharedInstance: CZStatusViewModel = CZStatusViewModel()
    
    private var isLoadingStatus = false
    
    /// 私有构造函数
    private override init() {
        super.init()
    }
    
    /**
     加载微博数据
     
     - parameter since_id:           下拉刷新加载比since_id大的微博,不需要就传入0
     - parameter max_id:             上拉加载更多,比max_id小的微博,不需要就传入0
     - parameter loadStatusCallback: 回调
     */
    func loadStatus(since_id: Int64, max_id: Int64, loadStatusCallback: (statuses: [CZStatus]?, error: NSError?) -> ()) {
        
        // 先判断是否有人正在加载微博数据
        if isLoadingStatus {
            // 自己搞个错误
            // domain: 错误范围,自定义
            // code: 自定义,错误类型
            // userInfo: 错误的附加信息
            let error = NSError(domain: "cn.itcast.error.repeatloadstatus", code: -1, userInfo: ["errorDescription" : "有人正在加载微博数据,直接返回,请下次在来"])
            loadStatusCallback(statuses: nil, error: error)
            return
        }
        
        // 去加载微博
        isLoadingStatus = true
        CZStatusDAL.sharedStatusDAL.loadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
            self.isLoadingStatus = false
            
            if error != nil {
                print("加载微博数据出错了: \(error)")
                loadStatusCallback(statuses: nil, error: error)
                return
            }
            
            var statusModelArray = [CZStatus]()
            // 加载数据成功了
            for dict in statuses! {
                let status = CZStatus(dict: dict)
                
                statusModelArray.append(status)
            }
            
            // 所有的数据都转成模型了
            loadStatusCallback(statuses: statusModelArray, error: nil)
        }
    }
    
    /**
     发布微博
     
     - parameter statusString:       要发布的微博文本内容
     - parameter sendStatusCallback: 发布微博后的回调
     */
    func sendStatus(image: UIImage?, statusString: String, sendStatusCallback: (error: NSError?) -> ()) {
        guard let access_token = CZUserAccountViewModel.sharedInstance.userAccount?.access_token else {
            CZPrint(items: "没有access_token")
            return
        }
        
        // 参数
        let prarameters = [
            "access_token" : access_token,
            "status" : statusString
        ]
        
        if let newImage = image {
            // 有图片
            let urlString = "https://upload.api.weibo.com/2/statuses/upload.json"
            
            CZNetworkTool.sharedInstance.POST(urlString, parameters: prarameters, constructingBodyWithBlock: { (formData) -> Void in
                // 上传图片
                let imageData = UIImagePNGRepresentation(newImage)!
                // data: NSData: 文件的2进制
                // name: Api文档指定的上传参数
                // fileName: 文件保存到服务器上面的名称,API有写就按API的来,没有写就随便,服务器会自己去重命名
                // mimeType: 上传文件的类型 image/png, image/jpeg, image/gif
                formData.appendPartWithFileData(imageData, name: "pic", fileName: "123", mimeType: "image/png")
                }, success: { (_, responseObject) -> Void in
                    sendStatusCallback(error: nil)
                }, failure: { (_, error) -> Void in
                    sendStatusCallback(error: error)
            })
        } else {
            // url
            let urlString = "2/statuses/update.json"
            
            // 发送请求 POST
            CZNetworkTool.sharedInstance.request(RequestMethod.POST, URLString: urlString, parameters: prarameters, success: { (_, responseObject) -> Void in
                sendStatusCallback(error: nil)
                }) { (_, error) -> Void in
                    sendStatusCallback(error: error)
            }
        }
    }
}
